#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <dirent.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>

// 有名管道路径
#define FIFO_PATH "/home/gec/123"

int open_dir(int fd, char *file_name)
{
	// 打开目录
	DIR *dr = opendir(file_name);
	if(dr == NULL)
	{
		perror("open dir error\n");
		return -1;
	}
	// 读取目录
	struct dirent *dp;
	char new_file_name[1024]={0};
	while((dp=readdir(dr))!=NULL)
	{
		memset(new_file_name, 0, sizeof(new_file_name));
		// 剔除.和..
		if(strcmp(dp->d_name, ".")==0 || strcmp(dp->d_name, "..")==0)
			continue;
		// 判断是否为目录文件
		if(dp->d_type == DT_DIR)
		{
			// 组合生成新的路径
			sprintf(new_file_name, "%s/%s", file_name, dp->d_name);
			open_dir(fd, new_file_name);
		}
		else if(dp->d_type == DT_REG) // 普通文件
		{
			usleep(5000);
			// 组合路径，写入管道文件
			sprintf(new_file_name, "%s/%s\n", file_name, dp->d_name);
			write(fd, new_file_name, strlen(new_file_name));
		}
	}
	closedir(dr);
}

int main(int argc, char *argv[])
{
	pid_t pid = atoi(argv[2]);
	// 判断管道文件是否存在
	if(access(FIFO_PATH, F_OK) != 0) // 不存在为真
	{
		int ret = mkfifo(FIFO_PATH, 0666);
		if(ret == -1)
		{
			perror("mkfifo error\n");
			return -1;
		}
	}
	// 打开管道文件
	int fd = open(FIFO_PATH, O_RDWR);
	if(fd == -1)
	{
		perror("open fifo failed\n");
		return -1;
	}
	// 调用目录检索
	open_dir(fd, argv[1]);
	close(fd); // 关闭管道

	kill(pid, 10);
	
	return 0;
}
